'use strict';

module.exports = core;
const path = require("path")
const semver = require("semver") // 比对版本号
const colors = require("colors/safe")
const { Command } = require('commander'); // 注册命令
const pkg = require("../package.json")
const log = require("@wss-cli-dev/log")
const execs = require("@wss-cli-dev/exec")
const usrHome = require("user-home")
const pathExists = require("path-exists").sync

const constant = require("./const");
let program = new Command()
let args, config

async function core() {
  try {
    await prepare()
    registryCommand()
  } catch (error) {
    log.error(error);
    if (program.debug) {
      console.log(e);
    }
  }
}
//  命令的注册  主要根据用户命令输入后执行对应操作
function registryCommand() {
  program
    .name(Object.keys(pkg.bin)[0])
    .usage("<command> [options]")
    .version(pkg.version)
    .option("-d, --debug", "是否开启debug模式", false)
    .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '');


  program.on("command:*", function (obj) {
    const availCommsnds = program.commands.map(cmd => cmd.name())
    console.log(colors.red("未知命令:" + obj[0]));
    if (availCommsnds.length > 0) {
      console.log(colors.red("可用命令:" + availCommsnds.join(",")));
    }
  })
  // 初始化 项目 操作
  program
    .argument("[init] [pojectName]")
    .argument("[script]")
    .option("-f, --force", "是否强制初始化项目")
    .action((name, options, command) => {
      if (command.targetPath) {
        process.env.CLI_TARGET_PATH = command.targetPath
      }
      execs(name, options, command)
    })

  program.parse(process.argv)

  if (program.args && program.args.length < 1) {
    program.outputHelp()
  }

  // 判断是否开启 debug模式
  const options = program.opts();
  if (options.debug) {
    process.env.LOG_LEVEL = "verbose"
  } else {
    process.env.LOG_LEVEL = "info"
  }
  log.level = process.env.LOG_LEVEL
}
async function prepare() {
  checkPkgVersion()
  checkRoot()
  checkUserHome()
  checkEnv()
  await checkGlobalUpdate()
}

// 检查是否最新版本 是否 更新
async function checkGlobalUpdate() {
  // 获取当前最新版本号
  // const { name,version} = pkg
  const currentVersion = pkg.version
  const npmName = pkg.name
  // 获取npm api 获取版本号
  const { getNpmInfo, getNpmVersion, getNpmSemverVersion } = require("@wss-cli-dev/get-npm-info")
  // const versions = await getNpmInfo(npmName)
  // console.log(versions);
  // 提取所有版本号 对比大于当前版本
  const lastVersion = await getNpmSemverVersion(currentVersion, npmName)
  console.log(lastVersion);
  // 获取最新 提示用户更新到最新版本
  if (lastVersion && semver.gt(lastVersion, currentVersion)) {
    log.warn(colors.yellow(`请手动更新${npmName},当前版本${currentVersion},最新版本${lastVersion}
    执行： npm install -g ${npmName}`))
  }

}


// 检查是否管理员权限 执行
function checkRoot() {
  const rootCheck = require("root-check")
  rootCheck()
}

// 检查用户主目录 是否存在 不存在 抛出异常 不执行 
function checkUserHome() {
  if (!usrHome || !pathExists(usrHome)) {
    throw new Error(colors.red("当前登陆用户目录不存在！"))
  }
}


// 检查环境变量
function checkEnv() {
  const dotenv = require("dotenv")
  const dotenvPath = path.resolve(usrHome, ".env")
  if (pathExists(dotenvPath)) {
    config = dotenv.config({
      path: dotenvPath
    })
  }
  // config = createDefaultConfig()
  createDefaultConfig()
  log.verbose("环境变量", process.env.CLI_HOME_PATH)
}

// 当找不到主目录下找不到环境变量配置 生成默认配置
function createDefaultConfig() {
  const cliConfig = {
    home: usrHome
  }
  if (process.env.CLI_HOME) {
    cliConfig["cliHome"] = path.join(usrHome, process.env.CLI_HOME)
  } else {
    cliConfig["cliHome"] = path.join(usrHome, constant.DEFAULT_CLI_HOME)
  }
  process.env.CLI_HOME_PATH = cliConfig["cliHome"]
  // return cliConfig
}



// TODO 测试使用 获取当前package.json 中版本号
function checkPkgVersion() {
  log.info(pkg.version);
}